#ifndef SCENE_HPP
#define SCENE_HPP

#include <Box2D.h>
#include <vector>

#include "ActionableElement.hpp"
#include "BoxElement.hpp"
#include "DoorElement.hpp"
#include "Element.hpp"
#include "ExitElement.hpp"
#include "FlashElement.hpp"
#include "HeroElement.hpp"
#include "MoveablePlatformElement.hpp"
#include "PlatformElement.hpp"
#include "RoomElement.hpp"
#include "SpotlightElement.hpp"
#include "SwitchElement.hpp"

using namespace std;

class Scene {
public:
    vector<ActionableElement*>* actionableElements;
    vector<BoxElement*>* boxElements;
    vector<Element*>* elements;
    DoorElement* exit;
    HeroElement* hero;
    string* message;
    vector<MoveablePlatformElement*>* moveablePlatformElements;
    RoomElement* room;
    float roomDepth;
    vector<SpotlightElement*>* spotlights;
    DoorElement* start;
    b2World* world;

    Scene();
    ~Scene();

    BoxElement* createBox(float x, float y);
    DoorElement* createDoor(float x, float y, float wallDirection);
    ExitElement* createExit(float x, float y);
    FlashElement* createFlash(float x, float y, float angle, const b2Vec2 impulse);
    HeroElement* createHero(float x, float y);
    MoveablePlatformElement* createMoveablePlatformElement(const b2Vec2* vertices, int numberOfVertices, const b2Vec2 start, const b2Vec2 end, float velocity);
    PlatformElement* createPlatform(const b2Vec2* vertices, int numberOfVertices);
    RoomElement* createRoom(int roomNumber, const b2Vec2* vertices, int numberOfVertices);
    SpotlightElement* createSpotlight(float x, float y, float angle, float arc, float length, LightElement::Type lightType);
    SwitchElement* createSwitch(float x, float y, float angle, ActionableElement* actionableElement);
    void setMessage(const string &message);
};

#endif
